package com.lyt.springboot.designPattern.iteratorPattern;

public class Main {
    public static void main(String[] args) {
        TaskList taskList = new TaskList();

        // 添加任务到任务列表
        taskList.addTask(new PrintTask("Hello, World!"));
        taskList.addTask(new ComputeTask("2 + 3 * (4 - 1)"));
        taskList.addTask(new PrintTask("This is the end of the tasks."));
        taskList.addTask(new ComputeTask("10 / 0"));  // 这将引发一个错误

        // 使用迭代器遍历并执行任务
        for (Task task : taskList) {
            task.execute();
        }
    }

    /**
     * 集合对象与迭代器的分离：
     * TaskList 类代表了一个集合对象，它内部使用 ArrayList 来存储任务（Task 对象）。
     * TaskList 实现了 Iterable<Task> 接口，这意味着它提供了一个迭代器工厂方法 iterator()，用于创建能够遍历其内部任务元素的迭代器。
     * 迭代器的使用：
     * 迭代器是由 TaskList 的 iterator() 方法返回的，它是一个 Iterator<Task> 对象。
     * 客户端代码（即 Main 类中的 for-each 循环）通过迭代器来访问 TaskList 中的每个任务，而无需知道 TaskList 的内部实现细节。
     * 顺序访问集合元素：
     * 迭代器提供了一种方法来顺序访问集合中的元素。在上面的例子中，for-each 循环实际上是通过迭代器来遍历 TaskList 中的每个 Task 对象。
     * 迭代器维护了一个内部状态（例如，当前指向的元素的索引），并在每次调用 next() 方法时返回集合中的下一个元素。
     * 隐藏集合的内部结构：
     * 迭代器模式的一个关键优点是它隐藏了集合的内部结构。客户端代码只能通过迭代器提供的接口（如 hasNext() 和 next()）来访问集合元素，而不能直接访问集合的内部表示。
     * 这使得集合类可以自由地改变其内部实现，而不会影响到使用迭代器的客户端代码。
     */
}